[AWS IoT Core] MQTT v5 に対応した 「MQTT テストクライアント」の動作を確認して見ました
1 はじめに
CX 事業本部のデリバリー部の平内(SIN)です。
AWS re:Invent 2022 で発表された、AWS IoT Core での MQTT v5 対応で、各種の機能が実装可能になっています。
[AWS IoT Core] MQTT v5 を使用してリクエスト・レスポンス パターンを実装して見ました
[AWS IoT Core] MQTT v5 を使用してユーザープロパティを実装して見ました
[AWS IoT Core] MQTT v5 を使用してトピック・エイリアスを実装して見ました
[AWS IoT Core] MQTT v5 を使用してメッセージ及び、セッション有効期限とクリーンスタートを実装して見ました
[AWS IoT Core] MQTT v5 を使用してレスポンスコードの確認を実装して見ました
[AWS IoT Core] MQTT v5 を使用してフォーマット識別要素で判別する Payload のパースを実装して見ました
これらの機能は、ほとんどが拡張されたプロパティ領域で実現されていますが、Publish 時に設定された、これらのプロパティの値は、 「MQTT テストクライアント」で確認できるようになっています。
今回は、ここに表示されている内容と、Publish しているコードの対比を確認してみました。
なお、現時点(2022/12/03)では、AWS で提供される SDK は、MQTT v5 に対応していないため、サンプル作成には、paho.mqtt を使用させて頂きました。
参考:https://dev.classmethod.jp/articles/aws-iot-core-mqtt-v5-sdk-for-python
2 サンプルコード
確認のために作成したコードです。
import time import os import json import ssl import paho.mqtt.client as mqtt from paho.mqtt.properties import Properties from paho.mqtt.packettypes import PacketTypes endpoint = "xxxxxxxxxxxx-ats.iot.ap-northeast-1.amazonaws.com" port = 8883 dir = os.path.dirname(os.path.abspath(__file__)) certs = { "cafile": "{}/certificates/AmazonRootCA1.pem".format(dir), "certfile": "{}/certificates/client-cert.pem".format(dir), "keyfile": "{}/certificates/private-key.pem".format(dir), } def main(): topic = "sensor/device01" client = mqtt.Client("client_id", protocol = mqtt.MQTTv5) client.tls_set(certs["cafile"], certfile=certs["certfile"], keyfile=certs["keyfile"], cert_reqs=ssl.CERT_REQUIRED, tls_version=ssl.PROTOCOL_TLSv1_2, ciphers=None) client.connect(endpoint, port, properties = None) client.loop_start() time.sleep(3) payload = json.dumps({"message":"hello"}) properties = Properties(PacketTypes.PUBLISH) properties.UserProperty = [("key1", "value1"),("key2", "value2"),("key3", "value3")] properties.ContentType = "application/json" properties.ResponseTopic = 'sensor/device01' properties.PayloadFormatIndicator = 1 properties.MessageExpiryInterval = 120 properties.CorrelationData = b"ABCDE" client.publish(topic, payload ,qos=0, properties = properties) time.sleep(1) if __name__ == "__main__": main()
3 コードとの対比
先のサンプルコードは、1つのメッセージを Publish するだけのものですが、この時、表示される 「MQTT テストクライアント」の「Properties」は、以下のようになっています。
対応は、それぞれ以下のような感じです。
(1) 相関データ
properties.CorrelationData = b"ABCDE"
参考:[AWS IoT Core] MQTT v5 を使用してリクエスト・レスポンス パターンを実装して見ました
(2) コンテンツタイプ
properties.ContentType = "application/json"
参考 [AWS IoT Core] MQTT v5 を使用してフォーマット識別要素で判別する Payload のパースを実装して見ました
(3) レスポンスのトピック
properties.ResponseTopic = 'sensor/device01'
参考:[AWS IoT Core] MQTT v5 を使用してリクエスト・レスポンス パターンを実装して見ました
(4) メッセージの有効期限間隔
properties.MessageExpiryInterval = 120
参考 [AWS IoT Core] MQTT v5 を使用してメッセージ及び、セッション有効期限とクリーンスタートを実装して見ました
(5) ペイロード形式のインジケータ
properties.PayloadFormatIndicator = 1
参考 [AWS IoT Core] MQTT v5 を使用してフォーマット識別要素で判別する Payload のパースを実装して見ました
(6) ユーザープロパティ
properties.UserProperty = [("key1", "value1"),("key2", "value2"),("key3", "value3")]
(7) サービス品質
Publish時に指定する、QoSで決定されます。 ここだけは、Publish時のpropertiesの値ではありません。
client.publish(topic, payload ,qos=0, properties = properties)
拡張されたプロパティの中には、 Maximum QoSというのがあるのですが、こちらは、CONNACKで使用されるものなので、PUBLISHではなく、CONNECTで指定することになります。
Property | Description | Input type | Packet |
---|---|---|---|
Maximum QoS | The maximum value of QoS that AWS IoT Core supports. Default is 1. AWS IoT Core doesn't support QoS2. | Byte | CONNACK |
テスト画面のサブスクライバーを起動(CONNECT)する時点で、QoS=1「サービスの品質 1 - メッセージは少なくとも 1 回配信されます」にしておかないと、デフォルトで、全て 0 になってしまうので注意が必要です。(AWS IoT では、QoS=0 及び、QoS=1に対応しています)
4 最後に
今回は、「MQTT テストクライアント」の「Properties」に表示されている内容と、Publish しているコードの対比を確認してみました。 テスト画面で、簡単にプロパティを確認できるのは、非常に便利だと思いました。